gusucode.com > Ado 实现C++对象的存取C#源码程序 > Ado 实现C++对象的存取/adocppobj/adocppobj/TestAdoDlg.cpp

    // TestAdoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestAdo.h"
#include "TestAdoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestAdoDlg dialog

CTestAdoDlg::CTestAdoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestAdoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestAdoDlg)
	m_nWidth = 0;
	m_sName = _T("test");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_pCon = NULL;
	m_pSet   = NULL;
	m_bState = FALSE;
	m_Line.Clear();
}

void CTestAdoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestAdoDlg)
	DDX_Control(pDX, IDC_LIST_DATA, m_List);
	DDX_Control(pDX, IDC_BUTTON_BK_COLOR, m_BtnBkColor);
	DDX_Control(pDX, IDC_BUTTON_COLOR, m_BtnColor);
	DDX_Text(pDX, IDC_EDIT_WIDTH, m_nWidth);
	DDX_Text(pDX, IDC_EDIT_NAME, m_sName);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestAdoDlg, CDialog)
	//{{AFX_MSG_MAP(CTestAdoDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CLOSE()
	ON_EN_UPDATE(IDC_EDIT_WIDTH, OnUpdateEditWidth)
	ON_WM_LBUTTONDOWN()
	ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
	ON_LBN_SELCHANGE(IDC_LIST_DATA, OnSelchangeListData)
	//}}AFX_MSG_MAP
	ON_MESSAGE( CPN_SELENDOK,  OnSelEndOK )
    ON_MESSAGE( CPN_SELCHANGE, OnSelEndOK )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestAdoDlg message handlers

BOOL CTestAdoDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	CString filename = GetAppPath() + "db.mdb";
	m_bState=OpenDb(filename);

	if (m_bState) LoadDbData();
	m_BtnBkColor.SetColor(m_Line.GetBkColor());
	m_BtnColor.SetColor(m_Line.GetColor());
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestAdoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTestAdoDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();

		CClientDC dc(this); // device context for painting
		CRect rc = GetRect(IDC_STATIC_RECT);
		m_Line.DrawBackGround(&dc,rc);
		m_Line.DrawPoint(&dc,rc);
	}


}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTestAdoDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CTestAdoDlg::OpenDb(CString filename)
{
	HRESULT hr=S_OK;
	hr=m_pCon.CreateInstance("ADODB.Connection"); 
	if (hr!=S_OK)
	{			 
		return FALSE;	 
	}
	try
	 {
		_bstr_t sCon;			 
		sCon=_bstr_t(filename); //路径名
		sCon="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+sCon;			 			  
		hr=m_pCon->Open(sCon,"","",adModeUnknown);
		if (hr!=S_OK)
		{			
			return FALSE;
		}		
		///////////////////////
		hr=m_pSet.CreateInstance("ADODB.Recordset");
		if (hr!=S_OK)
		{
			return FALSE;
		}
		m_pSet->CursorLocation=adUseClient;
		hr=m_pSet->Open("SELECT * FROM object_table",_variant_t((IDispatch*)m_pCon,TRUE),
			adOpenStatic,adLockOptimistic,adCmdText);
		if (hr!=S_OK)
		{
			return FALSE;
		}
		return TRUE;
		///////////////////////
	  }
	  catch(_com_error &e)
	  {
		 CString errorMessage;
		 errorMessage.Format("连接数据库失败!错误信息:%s",e.ErrorMessage());
		 return FALSE;		
	  }
	  return FALSE;
}

CString CTestAdoDlg::GetAppPath()
{
	 TCHAR sFilename[_MAX_PATH];
	TCHAR sDrive[_MAX_DRIVE];
	TCHAR sDir[_MAX_DIR];
	TCHAR sFname[_MAX_FNAME];
	TCHAR sExt[_MAX_EXT];
	GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH);
	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt);

	 CString strPath = CString(sDrive) + CString(sDir);
	if (strPath.Right(1) != _T('\\'))
	    strPath+= _T("\\"); 
    return strPath;     
}

void CTestAdoDlg::OnClose() 
{

	if (m_pCon->State)
	{
		m_pCon->Close();
		m_pCon = NULL;
	}
	if (m_pSet->State)
	{
		m_pSet->Close();
		m_pSet= NULL;
	}

	CDialog::OnClose();
}


void CTestAdoDlg::OnSelEndOK(UINT lParam, LONG wParam)
{
	switch( wParam )
	{
		case IDC_BUTTON_BK_COLOR:
		{
			m_Line.SetBkColor(m_BtnBkColor.GetColor());

		}
		case IDC_BUTTON_COLOR:
		{
			m_Line.SetColor(m_BtnColor.GetColor());
		}
		break;
	}

}

void CTestAdoDlg::OnUpdateEditWidth() 
{

	UpdateData();
	m_Line.SetWidth(m_nWidth);
	
}

CRect CTestAdoDlg::GetRect(UINT ID)
{
	CRect rc;
	GetDlgItem(ID)->GetWindowRect(&rc); 
	ScreenToClient(&rc); 
	return rc ; 
}

void CTestAdoDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	
	CRect rc = GetRect(IDC_STATIC_RECT);
	if (rc.PtInRect(point))
	{
		if (m_Line.GetSize()>0)
		{
			CPoint pt1 = m_Line.GetPoint(m_Line.GetSize()-1);
			CClientDC dc(this); // device context for painting
			m_Line.DrawLine(&dc,pt1,point,rc);
		}
		m_Line.AddPoint(point);

	}
	CDialog::OnLButtonDown(nFlags, point);
}

void CTestAdoDlg::OnButtonSave() 
{
	//m_List
	if (!m_bState) return;
	UpdateData();
	try
	{
		m_pSet->AddNew();
     	m_pSet->PutCollect("name", _variant_t(m_sName));
	
		//保存图形对象
		CMemFile memFile;
		CArchive ar(&memFile, CArchive::store);
		m_Line.Serialize(ar);
		ar.Close();
	
		DWORD dwSize = memFile.GetLength();
		LPBYTE lpInfo = memFile.Detach();

		VARIANT			varBLOB;
		SAFEARRAY		*psa;
		SAFEARRAYBOUND	rgsabound[1];
		
		rgsabound[0].lLbound = 0;
		rgsabound[0].cElements = dwSize;

		psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
		for (long i = 0; i < (long)dwSize; i++)
		{
			SafeArrayPutElement (psa, &i, lpInfo++);  
		}
		varBLOB.vt = VT_ARRAY | VT_UI1;
		varBLOB.parray = psa;			
		m_pSet->GetFields()->GetItem("object")->AppendChunk(varBLOB);	
		m_pSet->Update(); 
		m_List.AddString(m_sName);
	}
	catch(_com_error &e)
	{
		CString str=(char *)e.Description(); 
		MessageBox(str+"\r保存数据库出问题!","提示",MB_OK|MB_ICONWARNING);	
		return ;
	}

}

void CTestAdoDlg::OnButtonClear() 
{
	m_Line.Clear();
	CRect rc = GetRect(IDC_STATIC_RECT);
	InvalidateRect(rc);
}

void CTestAdoDlg::LoadDbData()
{
    _variant_t vData;
	m_pSet->MoveFirst();
	while (!m_pSet->adoEOF)
	{
		vData=m_pSet->GetCollect(_variant_t("name")); 			  
		if (vData.vt!=VT_NULL)
		{
			m_List.AddString((LPCTSTR)(_bstr_t)vData);
		} 
		m_pSet->MoveNext(); 
	}
}

void CTestAdoDlg::OnSelchangeListData() 
{
	int iPos = m_List.GetCurSel();	
	if (iPos<0) return ;
	m_pSet->MoveFirst();

	int i=0;
	while (i< iPos)
	{
		m_pSet->MoveNext(); 
		i++;
	}
	long lDataSize = m_pSet->GetFields()->GetItem(_variant_t("object"))->ActualSize;
	if(lDataSize <= 0) return;

	_variant_t			varBLOB;
	VariantInit (&varBLOB);
	
	varBLOB = m_pSet->GetFields()->GetItem(_variant_t("object"))->GetChunk(lDataSize);
	if(varBLOB.vt == (VT_ARRAY | VT_UI1))
	{
		BYTE *pBuf = new BYTE[lDataSize + 1];
		if(pBuf)				
		{	
			SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
			SafeArrayUnaccessData (varBLOB.parray);
			
			CMemFile memfile;
			memfile.Attach(pBuf,lDataSize);
			memfile.SeekToBegin();
			CArchive ar(&memfile, CArchive::load);
	
			m_Line.Serialize(ar);
			ar.Close();
			memfile.Detach();
			CRect rc = GetRect(IDC_STATIC_RECT);
			InvalidateRect(rc);
		}
	}
	VariantClear (&varBLOB);
}